package com.zjsru.plan2023.oneday;

/**
 * @Author: cookLee
 * @Date: 2023-11-16
 * 最长奇偶子数组
 * nums[l] % 2 == 0
 * 对于范围 [l, r - 1] 内的所有下标 i ，nums[i] % 2 != nums[i + 1] % 2
 * 对于范围 [l, r] 内的所有下标 i ，nums[i] <= threshold
 */
public class LongestAlternatingSubarray {
    /**
     * 主
     * \
     * 输入：nums = [3,2,5,4], threshold = 5
     * 输出：3
     * 解释：在这个示例中，我们选择从 l = 1 开始、到 r = 3 结束的子数组 => [2,5,4] ，满足上述条件。
     * 因此，答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        LongestAlternatingSubarray longestAlternatingSubarray = new LongestAlternatingSubarray();
        int[] nums = new int[]{3, 2, 5, 4};
        int threshold = 5;
        System.out.println(longestAlternatingSubarray.longestAlternatingSubarray(nums, threshold));
    }

    /**
     * 最长交替子阵:模拟
     *
     * @param nums      nums
     * @param threshold 阈值
     * @return int
     */
    public int longestAlternatingSubarray(int[] nums, int threshold) {
        int ans = 0;
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            for (int j = i; j < len; j++) {
                if (this.valid(i, j, nums, threshold)) {
                    ans = Math.max(ans, j - i + 1);
                }
            }
        }
        return ans;
    }

    /**
     * 有效期校验
     *
     * @param i         我
     * @param j         j
     * @param threshold 阈值
     * @param nums      nums
     * @return boolean
     */
    private boolean valid(int i, int j, int[] nums, int threshold) {
        if (nums[i] % 2 != 0) {
            return false;
        }
        for (int k = i; k <= j; k++) {
            if (nums[k] > threshold || (k < j && nums[k] % 2 == nums[k + 1] % 2)) {
                return false;
            }
        }
        return true;
    }
}
